package com.city.itis.action;

import java.io.File;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.city.itis.domain.Member;
import com.city.itis.domain.Site;
import com.city.itis.domain.SiteCategory;
import com.city.itis.service.MemberCategoryService;
import com.city.itis.service.MemberService;
import com.city.itis.service.SiteCategoryService;
import com.city.itis.service.SiteService;
import com.city.itis.util.Constants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * SiteAction
 * @author WY
 *
 */
public class SiteAction extends ActionSupport implements ModelDriven<Site> {
	
	private static final long serialVersionUID = 1L;	//系统自动生成的版本序列号
	private Site site = new Site();	//定义Site值类对象
	private List<Site> siteList;	//声明siteList对象
	private SiteService siteService;	//声明siteService对象
	private List<SiteCategory> siteCategoryList;	//声明siteCategoryList对象
	private SiteCategory siteCategory;	//声明siteCategory对象
	private SiteCategoryService siteCategoryService;	//申明siteCategoryService对象
	private String command=null;	//用于判断执行的动作
	private String url=null;		//action转向地址
	private String dealPhoto=null;	//对图片的处理动作
	private	File photo;  	//上传的图片文件
	private String photoFileName;	//上传图片名称
	private String photoContentType;	//上传图片类型
	Map<String,Object>map=null;
	private MemberService memberService;
	private MemberCategoryService memberCategoryService;
	private String msg=null;	//存放信息
	private String result=null;	//定义字符串类型变量，用户存放结果信息。
	
	public SiteService getSiteService() {
		return siteService;
	}
	@Resource
	public void setSiteService(SiteService siteService) {
		this.siteService = siteService;
	}
	
	/**
	 * 显示添加方法
	 * @return
	 */
	public String show_add()throws Exception
	{
		
		map=ActionContext.getContext().getSession();	//取得Session对象
		
		String loginType=(String)map.get("loginType");	//取得登录者是以何种身份登录的（会员还是管理员）
		
		//判断是以管理员身份还是以会员身份登录
		if(Constants.ADMIN.equals(loginType))	
		{
			show_category(site.getCategory().getCategoryNo());	//根据站点类别，查询该类别的站点信息。
			site.getCategory().setCategoryName(siteCategory.getCategoryName());	//设置站点类别名称
			
		}
		siteCategoryList=siteCategoryService.findAll();	//调用取得所有站点类别方法
		
		//判断站点类别列表是否为空
		if(siteCategoryList!=null) 	
		{
			url="/site/site_add.jsp";	//设置转向地址
			return SUCCESS;	
		}else
		{
			return ERROR;
		}
		
	}


	/**
	 * 添加方法
	 * @return
	 */
	public String add()throws Exception
	{
		
		map=ActionContext.getContext().getSession();	//取得Session对象
	
		String loginType=(String)map.get("loginType");	//取得登录者是以何种身份登录的（会员还是管理员）
		
		//判断是以管理员身份还是以会员身份登录
		if(Constants.ADMIN.equals(loginType))
		{
			site.setPhotoName(photoFileName);	//设置上传图片的名称
			
			site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
			
			int flag=(Integer)this.siteService.add(site);	//调用添加站点方法
			//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败) 
			if(flag>0)
			{
				save_photo();	//调用保存图片方法
				
				url="/site/list.action?site.category.categoryNo="+site.getCategory().getCategoryNo();	//设置转向地址
				
				return SUCCESS;
			}else
			{
				return ERROR;
			}
			
		}else
		{
			
			Member login_user=(Member)map.get("login_user");	//从session中取得登陆用户信息
			
			Member m=memberService.getMemberById(login_user.getId());	//根据会员编号，查询会员信息。
			
			//判断m是否为null
			if(m!=null)
			{
			
			Integer siteCount=m.getSiteCount();	//取得会员添加站点的数目
			//判断取得siteCount是否为null
			if(siteCount==null)
			{
				siteCount=0;
			}
		
			siteCount++;	//siteCount加1
			
			//判断会员是以金钻、银子还是铜钻身份
			if(Constants.COPPERMEMBER.equals(m.getCategory().getName()))	//铜钻会员
			{
				
				Integer level=m.getLevel();	//取得会员等级数
				if(level/100>0&&level%100==0)	//如果会员的级别是100的整数倍并且必须大于100，会员将会可以添加11个站点。
				{
					if(siteCount>11)	//如果添加站点数目超过12个以上，将会转向提示会员页面。要求付费升级会员。
					{
						msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费升级会员";
						url="/member/member_alert.jsp";
						return "member_alert";
					}
				}else	//此时会员自能添加10个站点
				{
						if(siteCount>10)	//如果添加站点数目超过11个以上，将会转向提示会员页面。要求付费升级会员。
						{
							msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费升级会员";
							url="/member/member_alert.jsp";
							return "member_alert";
						}
				}
			}else if(Constants.SILVERMEMBER.equals(m.getCategory().getName()))	//银钻会员
			{
				Integer level=m.getLevel();	//取得会员等级数
				if(level/100>0&&level%100==0)	//如果会员的级别是100的整数倍并且必须大于100，会员将会可以添加21个站点。
				{
					if(siteCount>21)	//如果添加站点数目超过21个以上，将会转向提示会员页面。要求付费升级会员。
					{
						msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费升级会员";
						url="/member/member_alert.jsp";
						return "member_alert";
					}
				}else	//此时会员自能添加10个站点
				{
						if(siteCount>20)	//如果添加站点数目超过11个以上，将会转向提示会员页面。要求付费升级会员。
						{
							msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费升级会员";
							url="/member/member_alert.jsp";
							return "member_alert";
						}
				}
			}else
			{
				Integer level=m.getLevel();	//取得会员等级数
				if(level/100>0&&level%100==0)	//如果会员的级别是100的整数倍并且必须大于100，会员将会可以添加21个站点。
				{
					if(siteCount>31)	//如果添加站点数目超过32个以上，将会转向提示会员页面。要求付费升级会员。
					{
						msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费升级会员";
						url="/member/member_alert.jsp";
						return "member_alert";
					}
				}else	//此时会员自能添加10个站点
				{
						if(siteCount>30)	//如果添加站点数目超过11个以上，将会转向提示会员页面。要求付费升级会员。
						{
							msg="我亲爱的会员，您添加的站点数目已经超过上限了。建议您付费";
							url="/member/member_alert.jsp";
							return "member_alert";
						}
				}
			}
			
				m.setSiteCount(siteCount);	//设置添加站点数目
				
				site.setPhotoName(photoFileName);	//设置上传图片名称
				
				site.setMember(m);	//将会员信息设置到站点对象中
				
				site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
				
				int flag=(Integer)this.siteService.add(site);	//调用添加站点方法
				
				//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败)
				if(flag>0)
				{
					if(site.getPhotoName()!=null)
					{
						save_photo();	//调用保存图片方法
					}
					memberService.modify(m);	//调用修改会员信息方法
					
					url="/site/listByMemberId.action"; //设置转向地址
					
					return SUCCESS;
				}else
				{
					return ERROR;
				}
			}else
			{
				return ERROR;
			}
			
		}
		
		
	}
	/**
	 * 删除方法
	 * @return
	 */
	public String delete()throws Exception
	{
		
		map=ActionContext.getContext().getSession();	//取得Session对象

		String loginType=(String)map.get("loginType");	//取得登录者是以何种身份登录的（会员还是管理员）
		
		//判断是以管理员身份还是以会员身份登录;
		if(Constants.ADMIN.equals(loginType))
		{
			site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
			
			int flag=(Integer)this.siteService.delete(site);	//调用删除站点信息方法
			
			//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败)
			if(flag>0)
			{
				if(site.getPhotoName()!=null)
				{
					delete_photo();	//调用删除图片方法
				}
				
				url="/site/list.action?site.category.categoryNo="+site.getCategory().getCategoryNo();	//设置转向地址
				
				return SUCCESS;
			}else
			{
				return ERROR;
			}

		}else 
		{
			
			Member login_user=(Member)map.get("login_user");	//从session中取得登陆用户信息
			
			Member m=memberService.getMemberById(login_user.getId());	//根据会员编号，查询会员信息。
			
			Integer siteCount=m.getSiteCount();	//取得会员添加站点的数目
			
			//判断siteCount是否为null
			if(siteCount==null)
			{
				siteCount=0;
			}
			
			siteCount--;	//siteCount-1
			
			if(siteCount<0)	//如果添加站点数目小于0，将会转向错误页面。
			{
				return ERROR;
			}
			
		
				site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
				
				int flag=(Integer)this.siteService.delete(site);	//调用删除站点信息方法
				
				//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败)
				if(flag>0)
				{
					if(site.getPhotoName()!=null)
					{
						delete_photo();	//调用删除图片方法
						
					}
				
					m.setSiteCount(siteCount);	//设置添加站点数目
					
					site.setMember(m);	//将会员信息设置到站点中
					
					memberService.modify(m);	//调用修改会员信息方法
					
					url="/site/listByMemberId.action";	//设置转向方法
					
					return SUCCESS;
				}else
				{
					return ERROR;
				}
			
		}
		
	}
	
	
	/**
	 * 修改方法
	 * @return
	 */
	public String modify()
	{
		try
		{
			
		
		//判断图片处理方法（修改图片、删除图片、保存图片）
		if(dealPhoto.equals(Constants.MODIFY))
		{
			save_photo();
			site.setPhotoName(photoFileName);
			
		}else if(dealPhoto.equals(Constants.DELETE))
		{
			delete_photo();
			site.setPhotoName(null);
		}else 
		{
			//执行保存图片动作
			site.setPhotoName(site.getPhotoName());
		}
		
		
		map=ActionContext.getContext().getSession();	//取得Session对象
		
		String loginType=(String)map.get("loginType");	//取得登录者是以何种身份登录的（会员还是管理员）
		
		//判断是以管理员身份还是以会员身份登录;
		if(Constants.ADMIN.equals(loginType))
		{
			
			site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
			
			int flag=(Integer)this.siteService.modify(site);	//调用修改站点信息方法
			
			//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败)
			if(flag>0)
			{
				url="/site/list.action?site.category.categoryNo="+site.getCategory().getCategoryNo();	//设置转向地址
				return SUCCESS;
			}else
			{
				return ERROR;
			}
			
		}else
		{
			
			Member login_user=(Member)map.get("login_user");	//从session中取得登陆用户信息
			
			site.setMember(login_user);	//设置会员信息到Site
			
			site.getCategory().setCategoryNo(site.getCategoryNo());	//设置站点类别编号
			
			int flag=(Integer)this.siteService.modify(site);	//调用修改站点信息方法
			
			//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败)
			if(flag>0)
			{
				url="/site/listByMemberId.action";	//设置转向地址
				return SUCCESS;
			}else
			{
				return ERROR;
			}
		}
		}catch(Exception e)
		{
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
		return SUCCESS;
	}
	
	/**
	 * 查询方法
	 * @return
	 */
	
	public String find()throws Exception
	{
		site=this.siteService.getSiteById(site.getSiteNo());	//根据站点编号,调用站点信息方法。
		
		//判断站点信息是否为null
		if(site!=null)
		{
			//判断查询目的（修改、删除和详细等）
			if(Constants.MODIFY.equals(command))
			{
				show_category_list();	//调用查询所有站点类别方法
				
				url="/site/site_modify.jsp";	//设置转向地址
				
				return SUCCESS;
			}else if(Constants.DELETE.equals(command))
			{
				show_category_list();	//调用查询所有站点类别方法
				
				url="/site/site_delete.jsp";	//设置转向地址
				
				return SUCCESS;
			}else
			{
				url="/site/site_detail.jsp";	//设置转向地址
				
				return SUCCESS;
			}
			
		}else
		{
			return ERROR;
		}
	}
	
	/**
	 * 根据站点名称，查询站点信息方法。
	 * @return
	 * @throws Exception
	 */
	public String getSiteBySiteName()throws Exception
	{
		String name = new String(site.getSiteName().getBytes("iso-8859-1"), "UTF-8");   
		
		 Site s=siteService.getSiteBySiteName(name);	//根据站点名称，调用查询站点信息方法。
		 
		 if(s!=null)
		 {
			result="站点已经存在";
		
		 }else
		 {
			result="恭喜您，该站点可用。";
			 
		 }
		return SUCCESS;
	}

	/**
	 * 显示所有信息方法
	 * @return
	 */
	public String list()throws Exception
	{
		
		show_category(site.getCategory().getCategoryNo());	//根据站点类别，查询该类别的站点信息。
		
		site.getCategory().setCategoryName(siteCategory.getCategoryName());	//设置站点类别名称
		
		siteList=this.siteService.findAllByCategoryNo(site.getCategory().getCategoryNo());	//调用所有站点信息方法
		
		//判断siteList对象是否为null
		if(siteList!=null)
		{
			url="/site/site_maint.jsp";	//设置转向地址
			
			return SUCCESS;
		}else
		{
			return ERROR;
		}
		
	}
	
	/**
	 * 根据会员编号，显示所有站点信息
	 * @return
	 * @throws Exception
	 */
	public String listByMemberId()throws Exception
	{
		map=ActionContext.getContext().getSession();	//取得Session对象
		
		Member m=(Member)map.get("login_user"); //取得会员登录信息
		//判断会员对象m是否为null
		if(m!=null)
		{
			siteList=siteService.listByMemberId(m.getId());	//根据会员编号，查询会员信息方法。
			
			url="/site/site_maint.jsp";	//设置转向地址
			
			return SUCCESS;
		}else
		{
			return LOGIN;
		}
	}
	
	/**
	 *显示类别列表方法
	 * @return
	 */
	public String show_category_list()throws Exception
	{
		siteCategoryList=siteCategoryService.findAll();	//调用查询所有站点类别方法
		
		//判断siteCategoryList对象是否为null
		if(siteCategoryList!=null)
		{
			return NONE;
		}else
		{
			return ERROR;
		}
		
	}
	
	/**
	 * 根据站点类别方法，调用查询站点类别信息方法。
	 * @param id	站点类别编号
	 * @throws Exception
	 */
    private void show_category(Integer id)throws Exception
    {
    	siteCategory=siteCategoryService.getSiteCategoryById(id);	//根据站点类别方法，调用查询站点类别信息方法。
    }
    
    
    /**
     * 保存图片方法
     */
	public void save_photo()throws Exception
	{
		
		String realPath=ServletActionContext.getServletContext().getRealPath("/upload");	//取得项目中upload文件的路径
		
		//判断上传的文件是否为null
		if(photo!=null)
		{
			
			File saveFile= new File(new File(realPath),photoFileName);	//根据创建文件名称上传的图片名称
			
			//如果upload文件不存在，将会自动创建。
			if(!saveFile.getParentFile().exists())
			{
				saveFile.getParentFile().mkdirs();	//调用创建文件方法
			}
			if(saveFile!=null)
			{
				FileUtils.copyFile(photo, saveFile);	//调用FileUtils.copyFile方法
				
			}

		}

	}
	
	/**
	 * 删除图片方法
	 */
	public void delete_photo()throws Exception
	{
		
		String realPath=ServletActionContext.getServletContext().getRealPath("/upload");	//取得项目中upload文件的路径
		//判断图片的名字是否为null
		if(site.getPhotoName()!=null)
		{
			
			File deleteFile= new File(new File(realPath),site.getPhotoName());	//根据创建删除文件，名字就是图片的名字。
			//如果upload文件不存在，将会自动创建。
			if(!deleteFile.getParentFile().exists())
			{
				deleteFile.getParentFile().mkdirs();	//调用创建文件方法
			}
			if(deleteFile!=null)
			{
					
				deleteFile.delete();	//调用delete方法
			}
			
		}		
	}
	
	
	@Override
	public Site getModel() 
	{
		return site;
	}



	public Site getSite() 
	{
		return site;
	}


	public void setSite(Site site) {
		this.site = site;
	}


	public List<Site> getSiteList() {
		return siteList;
	}

	public void setSiteList(List<Site> siteList) {
		this.siteList = siteList;
	}

	public String getCommand() {
		return command;
	}
	public void setCommand(String command) {
		this.command = command;
	}
	
	public List<SiteCategory> getSiteCategoryList() {
		return siteCategoryList;
	}
	public void setSiteCategoryList(List<SiteCategory> siteCategoryList) {
		this.siteCategoryList = siteCategoryList;
	}
	public SiteCategoryService getSiteCategoryService() {
		return siteCategoryService;
	}
	@Resource
	public void setSiteCategoryService(SiteCategoryService siteCategoryService) {
		this.siteCategoryService = siteCategoryService;
	}
	
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public File getPhoto() {
		return photo;
	}
	public void setPhoto(File photo) {
		this.photo = photo;
	}
	public String getPhotoFileName() {
		return photoFileName;
	}
	public void setPhotoFileName(String photoFileName) {
		this.photoFileName = photoFileName;
	}
	public String getPhotoContentType() {
		return photoContentType;
	}
	public void setPhotoContentType(String photoContentType) {
		this.photoContentType = photoContentType;
	}
	public String getDealPhoto() {
		return dealPhoto;
	}
	public void setDealPhoto(String dealPhoto) {
		this.dealPhoto = dealPhoto;
	}
	public MemberService getMemberService() {
		return memberService;
	}
	@Resource
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public MemberCategoryService getMemberCategoryService() {
		return memberCategoryService;
	}
	public void setMemberCategoryService(MemberCategoryService memberCategoryService) {
		this.memberCategoryService = memberCategoryService;
	}
	public String getResult() {
		return result;
	}
	public void setResult(String result) {
		this.result = result;
	}
	
	
}
